package com.tim.app;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.application.library.base.LSApplication;
import com.application.library.runtime.event.EventListener;
import com.application.library.runtime.event.EventManager;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
import com.netease.nim.DemoCache;
import com.netease.nim.session.NimDemoLocationProvider;
import com.netease.nim.session.SessionHelper;
import com.netease.nim.uikit.NimUIKit;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.Observer;
import com.netease.nimlib.sdk.SDKOptions;
import com.netease.nimlib.sdk.StatusBarNotificationConfig;
import com.netease.nimlib.sdk.StatusCode;
import com.netease.nimlib.sdk.auth.AuthServiceObserver;
import com.netease.nimlib.sdk.auth.LoginInfo;
import com.netease.nimlib.sdk.auth.constant.LoginSyncStatus;
import com.netease.nimlib.sdk.msg.constant.SessionTypeEnum;
import com.netease.nimlib.sdk.uinfo.UserInfoProvider;
import com.qiyukf.unicorn.api.ImageLoaderListener;
import com.qiyukf.unicorn.api.Unicorn;
import com.qiyukf.unicorn.api.UnicornImageLoader;
import com.qiyukf.unicorn.api.YSFOptions;
import com.tim.app.manager.WindowUtils;
import com.tim.app.netease.cache.NimUserInfoCache;
import com.tim.app.server.logic.UserManager;
import com.tim.app.server.net.NetworkHost;
import com.tim.app.ui.activity.MainActivity;
import com.tim.app.util.ViewGT;
import com.umeng.analytics.MobclickAgent;
import com.umeng.socialize.Config;
import com.umeng.socialize.PlatformConfig;
import com.umeng.socialize.UMShareAPI;
import com.umeng.socialize.utils.Log;

import cn.jpush.android.api.JPushInterface;

public class TimApplication extends LSApplication {

    public static final String TAG = "TimApplication";

    @Override
    public void onCreate() {
        super.onCreate();
        RT.application = this;
        RT.ins().init();
        UMShareAPI.get(this);
        Config.DEBUG = true;
        Log.LOG = false;
        PlatformConfig.setWeixin("wx7c1df1136554af6a", "127feb4fbcaabb57f02e83feec103735");
        PlatformConfig.setQQZone("101409108", "e9861618c877e19711d8f2582cba5bd4");
        PlatformConfig.setSinaWeibo("3032181475", "f1417e95479ba9c3c994e70fb0e04706", "http://sns.whalecloud.com");
        UMShareAPI.get(this);

        // appKey 可以在七鱼管理系统->设置->APP接入 页面找到
        Unicorn.init(this, "0e22db86fb2def0d8d524729704e0eb7", new YSFOptions(), new GlideImageLoader(this));

        EventManager.ins().registListener(-1, eventListener);

        MobclickAgent.openActivityDurationTrack(false);
        MobclickAgent.setDebugMode(RT.DEBUG);

        JPushInterface.setDebugMode(RT.DEBUG);
        JPushInterface.init(this);


        // SDK初始化（启动后台服务，若已经存在用户登录信息， SDK 将完成自动登录）
        NIMClient.init(this, loginInfo(), options());

        // ... your codes
        if (RT.inMainProcess(this)) {
            initUiKit();

            // 注意：以下操作必须在主进程中进行
            // 1、UI相关初始化操作
            // 2、相关Service调用
            NIMClient.getService(AuthServiceObserver.class).observeLoginSyncDataStatus(new Observer<LoginSyncStatus>() {
                @Override
                public void onEvent(LoginSyncStatus status) {
                    if (status == LoginSyncStatus.BEGIN_SYNC) {

                    } else if (status == LoginSyncStatus.SYNC_COMPLETED) {
                        NimUserInfoCache.getInstance().buildCache();
                    }
                }
            }, true);

            NIMClient.getService(AuthServiceObserver.class).observeOnlineStatus(
                    new Observer<StatusCode>() {
                        public void onEvent(StatusCode status) {
                            if (status.wontAutoLogin()) {
                                // 被踢出、账号被禁用、密码错误等情况，自动登录失败，需要返回到登录界面进行重新登录操作
                                UserManager.ins().logout(TimApplication.this);
                                ViewGT.gotoLoginActivity(TimApplication.this);
                            }
                        }
                    }, true);


        }

    }

    private void initUiKit() {
        // 初始化
        NimUIKit.init(this);
        // 设置地理位置提供者。如果需要发送地理位置消息，该参数必须提供。如果不需要，可以忽略。
        NimUIKit.setLocationProvider(new NimDemoLocationProvider());

        // 会话窗口的定制初始化。
        SessionHelper.init();
    }

    // 如果返回值为 null，则全部使用默认参数。
    private SDKOptions options() {
        SDKOptions options = new SDKOptions();

        // 如果将新消息通知提醒托管给 SDK 完成，需要添加以下配置。否则无需设置。
        StatusBarNotificationConfig config = new StatusBarNotificationConfig();
        config.notificationEntrance = MainActivity.class; // 点击通知栏跳转到该Activity
        config.notificationSmallIconId = R.drawable.ic_launcher;
        // 呼吸灯配置
        config.ledARGB = Color.GREEN;
        config.ledOnMs = 1000;
        config.ledOffMs = 1500;
        // 通知铃声的uri字符串
        config.notificationSound = "android.resource://com.netease.nim.demo/raw/msg";
        options.statusBarNotificationConfig = config;
        if (RT.HOST == NetworkHost.PUBLISH) {
            options.appKey = "f5fe4acc05208974ed1225c3efe973f3";
        } else {
            options.appKey = "c2aed04e605c5367788ed142fd6f708f";
        }

        // 配置保存图片，文件，log 等数据的目录
        // 如果 options 中没有设置这个值，SDK 会使用下面代码示例中的位置作为 SDK 的数据目录。
        // 该目录目前包含 log, file, image, audio, video, thumb 这6个目录。
        // 如果第三方 APP 需要缓存清理功能， 清理这个目录下面个子目录的内容即可。
        String sdkPath = Environment.getExternalStorageDirectory() + "/" + getPackageName() + "/nim";
        options.sdkStorageRootPath = sdkPath;

        // 配置是否需要预下载附件缩略图，默认为 true
        options.preloadAttach = true;

        // 配置附件缩略图的尺寸大小。表示向服务器请求缩略图文件的大小
        // 该值一般应根据屏幕尺寸来确定， 默认值为 Screen.width / 2
        options.thumbnailSize = RT.getScreenWidth() / 2;

        // 用户资料提供者, 目前主要用于提供用户资料，用于新消息通知栏中显示消息来源的头像和昵称
        options.userInfoProvider = new UserInfoProvider() {
            @Override
            public UserInfo getUserInfo(String account) {
                return null;
            }

            @Override
            public int getDefaultIconResId() {
                return R.drawable.ic_default_avatar;
            }

            @Override
            public Bitmap getTeamIcon(String tid) {
                return null;
            }

            @Override
            public Bitmap getAvatarForMessageNotifier(String account) {
                return null;
            }

            @Override
            public String getDisplayNameForMessageNotifier(String account, String sessionId,
                                                           SessionTypeEnum sessionType) {
                return null;
            }
        };
        return options;
    }

    // 如果已经存在用户登录信息，返回LoginInfo，否则返回null即可
    private LoginInfo loginInfo() {
        if (UserManager.ins().isLogin()) {
            // 从本地读取上次登录成功时保存的用户登录信息
            String account = UserManager.ins().getChatId(UserManager.ins().getUserId());
            String token = account;

            if (!TextUtils.isEmpty(account) && !TextUtils.isEmpty(token)) {
                DemoCache.setAccount(account);
                return new LoginInfo(account, token);
            } else {
                return null;
            }
        } else {
            return null;
        }
    }

    EventListener eventListener = new EventListener() {
        @Override
        public void handleMessage(int what, int arg1, int arg2, Object dataobj) {
            if (what == -1) {
                UserManager.ins().logout(TimApplication.this);
            }
        }
    };


    public class GlideImageLoader implements UnicornImageLoader {
        private Context context;

        public GlideImageLoader(Context context) {
            this.context = context.getApplicationContext();
        }

        @Nullable
        @Override
        public Bitmap loadImageSync(String uri, int width, int height) {
            return null;
        }

        @Override
        public void loadImage(String uri, int width, int height, final ImageLoaderListener listener) {
            Glide.with(context).load(uri).asBitmap().into(new SimpleTarget<Bitmap>(width, height) {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
                    if (listener != null) {
                        listener.onLoadComplete(resource);
                    }
                }

                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    if (listener != null) {
                        listener.onLoadFailed(e);
                    }
                }
            });
        }
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
        if (level == TRIM_MEMORY_UI_HIDDEN) {
            WindowUtils.getInStance().hidePopupWindow();
        }
    }
}
